﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QuanLyNganHangDe.DAL;
using QuanLyNganHangDe.DAL.Models;


namespace QuanLyNganHangDe.BLL
{
    /// <summary>
    /// Lớp xử lý nghiệp vụ liên quan đến thực thể học kỳ
    /// </summary>
    partial class BizHocKy
    {
        internal static HocKy AddHocKy(string namHoc, int hocKy)
        {
            //using (var context = new QLHPEntities())
            //{
            //    var oNamHoc = context.NamHocDbSet.Where(e => e.TenNamHoc == namHoc).FirstOrDefault();
            //    if (oNamHoc == null)
            //    {
            //        // Tạo năm học
            //        oNamHoc = new NamHoc() { TenNamHoc = namHoc };
            //        context.NamHocDbSet.Add(oNamHoc);
            //    }

            //    var oHocKy = context.HocKyDbSet.Where(e => e.MaNamHoc == namHoc && e.TenHocKy == hocKy).FirstOrDefault();
            //    if (oHocKy != null)
            //        throw new Exception(string.Format("Học kỳ {0} của năm học {1} đã tồn tại", 
            //            hocKy, oNamHoc.ToString()));
            //    oHocKy = new HocKy() { MaHocKy = Guid.NewGuid().ToString(), TenHocKy = hocKy, NamHoc = oNamHoc };
            //    context.HocKyDbSet.Add(oHocKy);

            //    context.SaveChanges();
            //    return oHocKy;
            //}
            return null;
        }

        internal static void DeleteHocKy(HocKy hocKy)
        {
            //using (var context = new QLHPEntities())
            //{
            //    var oHocKy = context.HocKyDbSet.Where(e => e.MaHocKy == hocKy.MaHocKy).FirstOrDefault();
            //    if (oHocKy == null)
            //        throw new Exception("Học kỳ không còn tồn tại trên hệ thống");
            //    try
            //    {
            //        context.HocKyDbSet.Remove(oHocKy);
            //        context.SaveChanges();
            //    }
            //    catch (Exception exc)
            //    {
            //        throw new Exception("Không thể xoá học kỳ được.\nChi tiết lỗi: " + exc.Message);
            //    }
            //}
        }


        /// <summary>
        /// Lấy danh sách các năm học
        /// </summary>
        /// <returns></returns>
        internal static IList<NamHoc> GetList_NamHoc()
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                var list = from nh in context.NamHocDbSet
                           orderby nh.NamHoc1 descending
                           select nh;
                return list.ToList();
            }
        }

        /// <summary>
        /// Lấy danh sách học kỳ trong một năm học cụ thể
        /// </summary>
        /// <param name="namHoc"></param>
        /// <returns></returns>
        internal static IList<HocKy> GetList_HocKy(string tenNamHoc)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                var lst = (
                    from hk in context.HocKyDbSet
                    orderby hk.NamHoc.NamHoc1 descending, hk.TenHocKy ascending
                    where hk.NamHoc.NamHoc1 == tenNamHoc
                    select hk
                ).ToList().ToSortableBindingList();
                return lst;
            }
        }

        /// <summary>
        /// Khởi tạo giá trị cho một học kỳ mặc định
        /// </summary>
        /// <returns></returns>
        internal static HocKy GetDefaultNew_HocKy()
        {
            return new HocKy
            {
                MaHocKy = System.Guid.NewGuid().ToString(),
                TenHocKy = 1,
            };
        }

        /// <summary>
        /// Xoá học kỳ
        /// </summary>
        /// <param name="hocKy"></param>
        internal static void Delete_HocKy(HocKy hocKy)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                var oHocKy = (from hk in context.HocKyDbSet
                              where hk.MaHocKy == hocKy.MaHocKy
                              select hk).FirstOrDefault();
                if (oHocKy == null)
                    throw new Exception("Không thể xóa học kỳ này!");
                else
                {
                    try
                    {
                        if (oHocKy.DotThiCollection.Count == 0)
                        {
                            context.HocKyDbSet.Remove(oHocKy);
                            context.SaveChanges();
                            int count = (from hk in context.HocKyDbSet
                                         where hk.MaNamHoc == hocKy.MaNamHoc
                                         select hk).Count();
                            if (count <= 0)
                            {
                                var namHoc = (from nh in context.NamHocDbSet
                                              where nh.NamHoc1 == hocKy.MaNamHoc
                                              select nh).SingleOrDefault();
                                if (namHoc != null)
                                {
                                    context.NamHocDbSet.Remove(namHoc);
                                    context.SaveChanges();
                                }
                            }
                        }
                        else
                        {
                            throw new Exception("Không thể xóa học kỳ này!");
                        }
                    }
                    catch (Exception exc)
                    {
                        throw new Exception(exc.Message);
                    }
                }
            }
        }

        /// <summary>
        /// Bổ sung học kỳ
        /// </summary>
        /// <param name="hocKy"></param>
        internal static void AddNew_HocKy(HocKy hocKy)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                int count = (from hk in context.HocKyDbSet
                             where hk.MaNamHoc == hocKy.MaNamHoc && hk.TenHocKy == hocKy.TenHocKy
                             select hk).Count();
                if (count > 0)
                    throw new Exception("Học kỳ này đã tồn tại!");
                else
                    try
                    {
                        {
                            count = (from nh in context.NamHocDbSet
                                     where nh.NamHoc1 == hocKy.MaNamHoc
                                     select nh).Count();
                            if (count <= 0)
                            {
                                NamHoc namhoc = new NamHoc() { NamHoc1 = hocKy.MaNamHoc };
                                context.NamHocDbSet.Add(namhoc);
                            }
                            context.HocKyDbSet.Add(hocKy);
                            context.SaveChanges();
                        }
                    }
                    catch (Exception exc)
                    {
                        throw new Exception("Không thể bổ sung học kỳ. Chi tiết lỗi: " + exc.Message);
                    }
            }
        }

        /// <summary>
        /// Chỉnh sửa học kỳ
        /// </summary>
        /// <param name="hocKy"></param>
        internal static void Update_HocKy(HocKy hocKy)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                int count = (from hk in context.HocKyDbSet
                             where
                                hk.MaNamHoc == hocKy.MaNamHoc &&
                                hk.TenHocKy == hocKy.TenHocKy &&
                                hk.MaHocKy != hocKy.MaHocKy
                             select hk).Count();
                if (count > 0)
                    throw new Exception("Học kỳ này đã tồn tại!");

                var oHocKy = (from hk in context.HocKyDbSet
                              where hk.MaHocKy == hocKy.MaHocKy
                              select hk).FirstOrDefault();
                if (hocKy == null)
                    throw new Exception("Học kỳ này chưa tồn tại!");
                try
                {
                    count = (from nh in context.NamHocDbSet
                             where nh.NamHoc1 == hocKy.MaNamHoc
                             select nh).Count();
                    if (count <= 0)
                    {
                        NamHoc namhoc = new NamHoc() { NamHoc1 = hocKy.MaNamHoc };
                        context.NamHocDbSet.Add(namhoc);
                    }
                    oHocKy.MaNamHoc = hocKy.MaNamHoc;
                    oHocKy.TenHocKy = hocKy.TenHocKy;
                    context.SaveChanges();
                }
                catch (Exception exc)
                {
                    throw new Exception("Không thể chỉnh sửa học kỳ! Chi tiết lỗi: " + exc.Message);
                }
            }
        }

        internal static HocKy GetHocKyByMaHK(string maHocKy, QLNHD_KHContext db = null)
        {
            if (db == null)
                using (var db2 = QLNHD_KHContext.GetContext())
                    return GetHocKyByMaHK(maHocKy, db2);
            else
                return db.HocKyDbSet.Include("NamHoc").Where(e => e.MaHocKy == maHocKy).FirstOrDefault();
        }
    }
}
